package com.briup.day11;

/**
 * @author 谭梦寻
 * @version 1.1
 * 匿名内部类
 * 是一种没有名字的内部类，本质上是一个特殊的局部内部类
 * （定义在方法内部）
 *  匿名内部类的俩种形式：
 *    利用父类，进行声明并创建匿名内部类对象， 这个匿名内部类默认就是这个父类的子类型
 *    利用接口，进行声明并创建匿名内部类对象，这个匿名内部类默认就是这个接口的实现类
 * 匿名内部类注意事项：
 *  匿名内部类必须依托于一个接口或一个父类（可以是抽象类，也可以是普通类）
 *  匿名内部类在声明的同时，就必须创建出对象，否则后面就没法创建了
 *  匿名内部类中无法定义构造器
 *
 *
 * 考虑这个内部类，如果需要反复的进行多次使用（必须有名字）
 * 在这个内部类中，如果需要定义静态的属性和方法，选择使用静态内部类
 * 在这个内部类中，如果需要访问外部类的非静态属性和方法，选择使用成员内部类
 * 考虑这个内部类，如果只需要使用一次（可以没有名字）
 * 选择使用匿名内部类
 * 局部内部类，几乎不会使用
 */
public class TestLocalClass {
    public static void main(String[] args) {
//        1 创建内部类 表示抽象类的子类
        AbsFather a = new AbsFather(){
            @Override
            public void run() {
                System.out.println("run不动了！");
            }
        };
        System.out.println(a == null);//false
        System.out.println(a.getClass());//class com.briup.day11.TestLocalClass$1
//        2 创建接口的实现类对象 实现接口
        Action a2 = new Action(){
            @Override
            public void eat() {
                System.out.println("eat饱了没？");
            }
        };
        System.out.println(a2 == null);//false
        System.out.println(a2.getClass());//class com.briup.day11.TestLocalClass$1

    }
}
abstract class AbsFather {
    public abstract void run ();
}
interface Action {
    public void eat();
}
